class: center, middle, inverse, title-slide # Data Science in the Time of Coronavirus ## Storytelling with Data Visualizations ### Srikanth Aravamuthan ### September 12, 2022 --- <style> .center-mid { position: relative; top: 50%; transform: translateY(15%); } .kinda-center-mid { position: relative; top: 50%; transform: translateY(15%); } .center-left { position: relative; top: 50%; transform: translateY(30%); } .center-right { position: relative; top: 50%; transform: translateY(30%); } .big-text { font-size: 26px; padding: 0.5em 0em 0em 0em; line-height: 1.9em; } .kinda-big-text { font-size: 24px; padding: 0.2em 0em 0em 0em; } .kinda-small-text { font-size: 14px; } .really-big-text { font-size: 36px; } </style> # Background & Research .pull-left[ <img src="profile-picture.png" width="100%" border = "1"> ] .pull-right[ - Work for Prof. Dörte Döpfer - Background in Math & Science - Experience in Wet & Dry Lab Research ] --- # Are you an artist? .center-mid[ .center[ <img src="bavarian-brown-cattle-heifer.png" height="400" border = "1"> ] ] --- # Generative aRt .pull-left[ <img src="metallic-ratios.gif" width="100%" border = "1"> ] .pull-right[ <img src="metallic-ratios.jpg" width="100%" border = "1"> ] .center[ [aravamu2.shinyapps.io/sunflower/](https://aravamu2.shinyapps.io/sunflower/) ] --- # Generative aRt .pull-left[ <img src="racaman-sequence.gif" width="100%" border = "1"> ] .pull-right[ <img src="racaman-sequence.jpg" width="100%" border = "1"> ] --- # Where do we go from here? </br> </br> .font150[ "The simple graph has brought more information to the data analyst’s mind than any other device." **- John Tukey** ] --- # Data Visualization Triangle .center-mid[ .center[ <img src="data-viz-triangle.png" height="400" border = "1"> ] ] --- # Where are we going? </br> </br> .font150[ "The greatest value of a picture is when it forces us to notice what we never expected to see." **- John Tukey** ] --- class: inverse, mline, center, middle # Ecological Diffusion of White Nose Syndrome Daniel Walsh & Robin Russell (USGS) Ting Fung Ma & Jun Zhu (University of Wisconsin-Madison) --- # White-Nose Syndrome (WNS) .pull-left[ - A disease that has killed millions of hibernating bats in North America. - Caused by *Pseudogymnoascus destructans* (Pd), a fungus which damages skin so much that bats warm up and become active, wasting energy they need to make it through the winter. - Found in 33 states and 7 Canadian provinces and the fungus without the syndrome had been found in 3 more states. ] .pull-right[ <img src="wns-map.jpg" width="100%" border = "1"> ] --- # Goal We aim to detect the time such that `\(p_{s,t}>\eta\)`, where `\(\eta\)` is a given decision threshold and future resource (sample) allocation will be based on the latest set of estimators `\(\{p_{s,t}\}_{s=1}^S\)`. -- - To provide a list of recommended counties/ecoregions to sample in the upcoming active surveillance season -- - To forecast the spread of the disease over the long-run in the North America --- # Recommendation Table: High prevalence cells for sampling by growth rate .center[ <img src="tab_2.png" width="100%" border = "0"> ] --- # Recommendation Table: High prevalence states and ecoregions for sampling by growth rate .center[ <img src="tab_3.png" width="100%" border = "0"> ] --- # Recommendation **High prevalence cells for sampling by state and ecoregion** .pull-left[ <img src="fig_2a.svg" width="100%" border = "1"> ] .pull-right[ <img src="fig_2b.svg" width="100%" border = "1"> ] --- # Forecasting of WNS .center[ <img src="facet.png" width="65%" border = "1"> ] --- # Forecasting of WNS .center[ <img src="anim.gif" width="65%" border = "1"> ] --- # I'm *not* Batman .center[ <img src="batman.gif" width="95%" border = "1"> ] --- class: inverse, mline, center, middle # COVID-19 Visualizations of Descriptive Statistics Sean Kent, Steve Goldstein, and Brian Yandell (University of Wisconsin-Madison) Francisco Mandujano & Dörte Döpfer (University of Wisconsin-Madison) --- # New York Times Data Visualizations .pull-left[ <center> <img src="data:image/png;base64,#nyt-upshot-headline.png" alt="diagonal layout" width="60%" border = "1"/> <img src="data:image/png;base64,#nyt-upshot-growth-rate-vs-time.png" alt="diagonal layout" width="60%" border = "1"/> </center> ] .pull-right[ <center> <img src="data:image/png;base64,#nyt-upshot-metro-box.png" alt="diagonal layout" width="60%" border = "1"/> <img src="data:image/png;base64,#nyt-upshot-growth-rate-vs-cases.png" alt="diagonal layout" width="60%" border = "1"/> </center> </br> <div style="width:300; word-wrap: break-word;"> <https://www.nytimes.com/interactive/2020/04/03/upshot/coronavirus-metro-area-tracker.html> </div> ] --- # COVID-19 Growth Rates in Wisconsin .kinda-big-text[ "*Wisconsin leaders need information about the extent and impact of COVID-19 to make good decisions.*" - **AFI DSI COVID-19 Research Group Charter** "*Can we add value with visualizations of growth rates in Wisconsin metro areas?*" - **Steve Goldstein** **Audience**: - Wisconsin public health officials - Health system officials - Interested modelers and citizens ] --- # COVID-19 Growth Rates in Wisconsin .pull-left[ <center> <img src="daily-growth-rate.png" height="200" border = "1"> </br> </br> <img src="map-metro-areas-cases.png" height="200" border = "1"> </center> ] .pull-right[ <center> <img src="growth-rate-case-count.png" height="200" border = "1"> </br> </br> <img src="map-metro-areas-deaths.png" height="200" border = "1"> </center> ] .center[ </br> [data-viz.it.wisc.edu/wi-metro-growth-rate/](https://data-viz.it.wisc.edu/wi-metro-growth-rate/) ] --- # COVID-19 Growth Rates in Wisconsin .pull-left[ <center> <img src="new-cases-case-count.png" width="100%" border = "1"> </center> ] .pull-right[ <center> <img src="new-cases-case-count-per-capita.png" width="100%" border = "1"> </center> ] --- # Website .pull-left[ .big-text[ - [data-viz.it.wisc.edu/wi-metro-growth-gundersen/](https://data-viz.it.wisc.edu/wi-metro-growth-gundersen/) - [data-viz.it.wisc.edu/wi-metro-growth-marshfield/](https://data-viz.it.wisc.edu/wi-metro-growth-marshfield/) ] ] .pull-right[ .big-text[ - Daily updates to data - Customized to the needs of heath system ] ] .center[ <img src="data:image/png;base64,#rstudio-connect.png" alt="diagonal layout" height="150"/> <img src="data:image/png;base64,#rstudio-server-pro.png" alt="diagonal layout" height="150"/> ] --- # Geofaceting Instantaneous R<sub>0</sub> .kinda-big-text[ **Project Idea**: "*Can we summarize `\(R_0\)` spatially and temporally for all Wisconsin counties over all time points.*" **Audience**: - Wisconsin public health officials - Interested modelers and citizens ] --- # Geofaceting Instantaneous R<sub>0</sub> .pull-left[ <img src="instantaneous-r0.png" width="100%" border = "1"> ] .pull-right[ - Preserves the geographical orientation - Maintains the time dependence - Won honorable mention in John Hunter Excellence in Plotting Competition at SciPy 2020 - Website: [data-viz.it.wisc.edu/instantaneous-r0-geofacet-wi-county/](https://data-viz.it.wisc.edu/instantaneous-r0-geofacet-wi-county/) ] --- # COVID-19 Activity Level in Wisconsin .kinda-big-text[ **Project Idea**: - Overlay HERC regions on the county map - View the census track level map - View time series ] .kinda-big-text[ **Audience**: - Wisconsin public health officials - Interested modelers ] --- # COVID-19 Activity Level in Wisconsin .pull-left[ <center> <img src="dhs-herc-regions.png" height="200" border = "1"> </br> </br> <img src="map-anim.png" height="200" border = "1"> </center> ] .pull-right[ <center> <img src="dhs-covid-19-activity-level.png" height="200" border = "1"> </br> </br> <img src="dane-county-map-anim.png" height="200" border = "1"> </center> ] .center[ </br> [data-viz.it.wisc.edu/dashboard/](https://data-viz.it.wisc.edu/dashboard/) ] --- # SARS-CoV-2 Screening Strategies .pull-left[ <center> <img src="data:image/png;base64,#paltiel-paper.png" width = "100%" border = "1"/> <img src="data:image/png;base64,#larremore-paper.png" width = "100%" border = "1"/> </center> </br> <div style="width:300; word-wrap: break-word;"> <https://jamanetwork.com/journals/jamanetworkopen/fullarticle/2768923> </div> ] .pull-right[ <center> <img src="data:image/png;base64,#paltiel-model.png" alt="diagonal layout" width="100%"/> <img src="data:image/png;base64,#paltiel-iso-dorm.png" alt="diagonal layout" width="100%"/> </center> ] --- # SARS-CoV-2 Screening Strategies .kinda-big-text[ **Project Idea**: "*Can we implement an interactive dashboard with improved accessibility and ease of use.*" **Audience**: - University of Wisconsin-Madison campus leaders - Interested modelers ] --- # SARS-CoV-2 Screening Strategies .pull-left[ <img src="paltiel-covid-19-dashboard.png" width="100%" border = "1"> ] .pull-right[ - Calculate minimum performance attributes of a SARS-CoV-2 monitoring program - Suggest what isolation and treatment capacity would need to be in place - Forecast what testing might cost - Recommended by the authors of the paper - Website: [data-viz.it.wisc.edu/covid-19-screening/](https://data-viz.it.wisc.edu/covid-19-screening/) ] --- # Nowcast COVID-19 Cases and Hospitalizations .kinda-big-text[ **Project Idea**: - Nowcast cases by HERC regions - Nowcast hospitalizations by HERC regions - View time series - View coverage of credible intervals ] .kinda-big-text[ **Audience**: - Wisconsin public health officials - Interested modelers ] --- # Nowcast COVID-19 Cases and Hospitalizations .pull-left[ <center> <img src="cases.png" height="200" border = "1"> </br> </br> <img src="hosp.png" height="200" border = "1"> </center> ] .pull-right[ <center> <img src="r.png" height="200" border = "1"> </br> </br> <img src="coverage-all-reference.png" height="200" border = "1"> </center> ] .center[ </br> [https://data-viz.it.wisc.edu/cases-r-hosp-geofacet-wi-region/](https://data-viz.it.wisc.edu/cases-r-hosp-geofacet-wi-region/) ] --- # Nowcast COVID-19 Cases and Hospitalizations .center-mid[ .center[ <img src="brms-manuscript.png" height="400" border = "1"> ] ] --- class: inverse, mline, center, middle # Automate DairyCOMP 305 Emil Walleser & Dörte Döpfer (University of Wisconsin-Madison) --- # DairyCOMP 305 .center-mid[ .center[ <img src="no.gif" height="100%" border = "1"> ] ] --- # Automate DairyCOMP 305 .kinda-big-text[ **Project Idea**: - Automate DairyCOMP 305 write out - Apply tools to support data-driven decisions - Customize reports and graphs for a better management experience ] .kinda-big-text[ **Audience**: - Dairy Skills I instructors & students - DairyCOMP 305 users ] --- # DairyCOMP 305 .pull-left[ <img src="dairy-comp.png" width="100%" border = "1"> ] .pull-right[ <img src="dairy-comp-1.png" width="100%" border = "1"> ] --- # Automate DairyCOMP 305 .center-mid[ .center[ <img src="welcome.gif" height="100%" border = "1"> ] ] --- class: inverse, mline, center, middle # Teaching Data Visualizations with Data Visualizations --- class: split-40 count: false .pull-left[.content[ ```r *gapminder ``` ]] .pull-right[.content[ ``` # A tibble: 1,704 x 6 country continent year lifeExp pop gdpPercap <fct> <fct> <int> <dbl> <int> <dbl> 1 Afghanistan Asia 1952 28.8 8425333 779. 2 Afghanistan Asia 1957 30.3 9240934 821. 3 Afghanistan Asia 1962 32.0 10267083 853. 4 Afghanistan Asia 1967 34.0 11537966 836. 5 Afghanistan Asia 1972 36.1 13079460 740. 6 Afghanistan Asia 1977 38.4 14880372 786. 7 Afghanistan Asia 1982 39.9 12881816 978. 8 Afghanistan Asia 1987 40.8 13867957 852. 9 Afghanistan Asia 1992 41.7 16317921 649. 10 Afghanistan Asia 1997 41.8 22227415 635. # ... with 1,694 more rows ``` ]] --- class: split-40 count: false .pull-left[.content[ ```r gapminder %>% * filter(year == max(year)) ``` ]] .pull-right[.content[ ``` # A tibble: 142 x 6 country continent year lifeExp pop gdpPercap <fct> <fct> <int> <dbl> <int> <dbl> 1 Afghanistan Asia 2007 43.8 31889923 975. 2 Albania Europe 2007 76.4 3600523 5937. 3 Algeria Africa 2007 72.3 33333216 6223. 4 Angola Africa 2007 42.7 12420476 4797. 5 Argentina Americas 2007 75.3 40301927 12779. 6 Australia Oceania 2007 81.2 20434176 34435. 7 Austria Europe 2007 79.8 8199783 36126. 8 Bahrain Asia 2007 75.6 708573 29796. 9 Bangladesh Asia 2007 64.1 150448339 1391. 10 Belgium Europe 2007 79.4 10392226 33693. # ... with 132 more rows ``` ]] --- class: split-40 count: false .pull-left[.content[ ```r gapminder %>% filter(year == max(year)) %>% * mutate(continent = ifelse(continent %in% c("Asia","Oceania"),"Asia & Oceania", as.character(continent))) ``` ]] .pull-right[.content[ ``` # A tibble: 142 x 6 country continent year lifeExp pop gdpPercap <fct> <chr> <int> <dbl> <int> <dbl> 1 Afghanistan Asia & Oceania 2007 43.8 31889923 975. 2 Albania Europe 2007 76.4 3600523 5937. 3 Algeria Africa 2007 72.3 33333216 6223. 4 Angola Africa 2007 42.7 12420476 4797. 5 Argentina Americas 2007 75.3 40301927 12779. 6 Australia Asia & Oceania 2007 81.2 20434176 34435. 7 Austria Europe 2007 79.8 8199783 36126. 8 Bahrain Asia & Oceania 2007 75.6 708573 29796. 9 Bangladesh Asia & Oceania 2007 64.1 150448339 1391. 10 Belgium Europe 2007 79.4 10392226 33693. # ... with 132 more rows ``` ]] --- class: split-40 count: false .pull-left[.content[ ```r gapminder %>% filter(year == max(year)) %>% mutate(continent = ifelse(continent %in% c("Asia","Oceania"),"Asia & Oceania", as.character(continent))) %>% * ggplot() ``` ]] .pull-right[.content[ <img src="data:image/png;base64,#presentation_files/figure-html/output_gapminder_4-1.png" style="display: block; margin: auto;" /> ]] --- class: split-40 count: false .pull-left[.content[ ```r gapminder %>% filter(year == max(year)) %>% mutate(continent = ifelse(continent %in% c("Asia","Oceania"),"Asia & Oceania", as.character(continent))) %>% ggplot() + * aes(x = gdpPercap, * y = lifeExp) ``` ]] .pull-right[.content[ <img src="data:image/png;base64,#presentation_files/figure-html/output_gapminder_6-1.png" style="display: block; margin: auto;" /> ]] --- class: split-40 count: false .pull-left[.content[ ```r gapminder %>% filter(year == max(year)) %>% mutate(continent = ifelse(continent %in% c("Asia","Oceania"),"Asia & Oceania", as.character(continent))) %>% ggplot() + aes(x = gdpPercap, y = lifeExp) + * geom_point(aes(size = pop, * color = country), * alpha = 0.7, * show.legend = FALSE) ``` ]] .pull-right[.content[ <img src="data:image/png;base64,#presentation_files/figure-html/output_gapminder_10-1.png" style="display: block; margin: auto;" /> ]] --- class: split-40 count: false .pull-left[.content[ ```r gapminder %>% filter(year == max(year)) %>% mutate(continent = ifelse(continent %in% c("Asia","Oceania"),"Asia & Oceania", as.character(continent))) %>% ggplot() + aes(x = gdpPercap, y = lifeExp) + geom_point(aes(size = pop, color = country), alpha = 0.7, show.legend = FALSE) + * scale_color_manual(values = country_colors) ``` ]] .pull-right[.content[ <img src="data:image/png;base64,#presentation_files/figure-html/output_gapminder_11-1.png" style="display: block; margin: auto;" /> ]] --- class: split-40 count: false .pull-left[.content[ ```r gapminder %>% filter(year == max(year)) %>% mutate(continent = ifelse(continent %in% c("Asia","Oceania"),"Asia & Oceania", as.character(continent))) %>% ggplot() + aes(x = gdpPercap, y = lifeExp) + geom_point(aes(size = pop, color = country), alpha = 0.7, show.legend = FALSE) + scale_color_manual(values = country_colors) + * scale_size(range = c(2, 12)) ``` ]] .pull-right[.content[ <img src="data:image/png;base64,#presentation_files/figure-html/output_gapminder_12-1.png" style="display: block; margin: auto;" /> ]] --- class: split-40 count: false .pull-left[.content[ ```r gapminder %>% filter(year == max(year)) %>% mutate(continent = ifelse(continent %in% c("Asia","Oceania"),"Asia & Oceania", as.character(continent))) %>% ggplot() + aes(x = gdpPercap, y = lifeExp) + geom_point(aes(size = pop, color = country), alpha = 0.7, show.legend = FALSE) + scale_color_manual(values = country_colors) + scale_size(range = c(2, 12)) + * scale_x_log10() ``` ]] .pull-right[.content[ <img src="data:image/png;base64,#presentation_files/figure-html/output_gapminder_13-1.png" style="display: block; margin: auto;" /> ]] --- class: split-40 count: false .pull-left[.content[ ```r gapminder %>% filter(year == max(year)) %>% mutate(continent = ifelse(continent %in% c("Asia","Oceania"),"Asia & Oceania", as.character(continent))) %>% ggplot() + aes(x = gdpPercap, y = lifeExp) + geom_point(aes(size = pop, color = country), alpha = 0.7, show.legend = FALSE) + scale_color_manual(values = country_colors) + scale_size(range = c(2, 12)) + scale_x_log10() + * facet_wrap(vars(continent)) ``` ]] .pull-right[.content[ <img src="data:image/png;base64,#presentation_files/figure-html/output_gapminder_14-1.png" style="display: block; margin: auto;" /> ]] --- class: split-40 count: false .pull-left[.content[ ```r gapminder %>% filter(year == max(year)) %>% mutate(continent = ifelse(continent %in% c("Asia","Oceania"),"Asia & Oceania", as.character(continent))) %>% ggplot() + aes(x = gdpPercap, y = lifeExp) + geom_point(aes(size = pop, color = country), alpha = 0.7, show.legend = FALSE) + scale_color_manual(values = country_colors) + scale_size(range = c(2, 12)) + scale_x_log10() + facet_wrap(vars(continent)) + * labs(x = "GDP per Capita", * y = "Life Expectancy") ``` ]] .pull-right[.content[ <img src="data:image/png;base64,#presentation_files/figure-html/output_gapminder_16-1.png" style="display: block; margin: auto;" /> ]] --- class: split-40 count: false .pull-left[.content[ ```r gapminder %>% filter(year == max(year)) %>% mutate(continent = ifelse(continent %in% c("Asia","Oceania"),"Asia & Oceania", as.character(continent))) %>% ggplot() + aes(x = gdpPercap, y = lifeExp) + geom_point(aes(size = pop, color = country), alpha = 0.7, show.legend = FALSE) + scale_color_manual(values = country_colors) + scale_size(range = c(2, 12)) + scale_x_log10() + facet_wrap(vars(continent)) + labs(x = "GDP per Capita", y = "Life Expectancy") + * theme_bw() ``` ]] .pull-right[.content[ <img src="data:image/png;base64,#presentation_files/figure-html/output_gapminder_17-1.png" style="display: block; margin: auto;" /> ]] --- class: split-40 count: false .pull-left[.content[ ```r gapminder %>% filter(year == max(year)) %>% mutate(continent = ifelse(continent %in% c("Asia","Oceania"),"Asia & Oceania", as.character(continent))) %>% ggplot() + aes(x = gdpPercap, y = lifeExp) + geom_point(aes(size = pop, color = country), alpha = 0.7, show.legend = FALSE) + scale_color_manual(values = country_colors) + scale_size(range = c(2, 12)) + scale_x_log10() + facet_wrap(vars(continent)) + labs(x = "GDP per Capita", y = "Life Expectancy") + theme_bw() + * theme(strip.background = element_rect(fill = "white")) ``` ]] .pull-right[.content[ <img src="data:image/png;base64,#presentation_files/figure-html/output_gapminder_18-1.png" style="display: block; margin: auto;" /> ]] --- .pull-left[ ```r gapminder %>% mutate(continent = ifelse(continent %in% c("Asia","Oceania"),"Asia & Oceania", as.character(continent))) %>% ggplot() + aes(x = gdpPercap, y = lifeExp) + geom_point(aes(size = pop, color = country), alpha = 0.7, show.legend = FALSE) + scale_color_manual(values = country_colors) + scale_size(range = c(2, 12)) + scale_x_log10() + facet_wrap(vars(continent)) + labs(title = "Year: {frame_time}", x = "GDP per Capita", y = "Life Expectancy") + theme_bw() + theme(strip.background = element_rect(fill = "white")) + transition_time(year) + ease_aes('linear') ``` ] .pull-right[ <img src="anim-gapminder.gif" width="100%" border = "1"> ] --- class: inverse, mline, center, middle # Presenting Data Visualizations with Data Visualizations --- # Presentation Application .center-mid[ .center[ <img src="powerpoint.gif" height="100%" border = "1"> ] ] --- # Presentation Application .center-mid[ .center[ <img src="xaringan.png" height="400" border = "1"> ] ] --- layout: false class: inverse, center, middle # **Thank You!** <center> <img src="profile-picture-batman.jpg" width="25%" border = "1"> </center> --- layout: false class: inverse, center, middle # **Thank You!** <center> <img src="meeting.gif" width="25%" border = "1"> </center> --- <style type="text/css"> .remark-code{line-height: 1.5; font-size: 80%} </style>